package com.itheima.filter;

import com.itheima.utils.JwtUtils;
import io.jsonwebtoken.Claims;
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;

/**
 * @Description: TokenFilter 请求过滤器
 * @Author: HH
 * @Date: 2025/4/20 15:04
 **/
@Slf4j
// @WebFilter("/*")
public class TokenFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 由于我们是基于http协议的网页，所以我们需要将请求和响应进行类型转换
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        // 1. 获取请求路径
        String requestURI = request.getRequestURI(); // /login
        log.info("拦截到请求，请求路径为：" + requestURI);

        // 2. 判断是否为登录请求(包含login， 是登陆请求)，直接放行，记录日志
        if (requestURI.contains("login")) {// 校验是否为登录请求
            log.info("登录请求，放行");
            filterChain.doFilter(request, response);
            return;
        }

        // 3. 获取请求头中的token(JWT令牌)
        String token = request.getHeader("token"); // 从请求头中获取token

        // 4. 判断token是否存在，不存在，记录日志，响应状态码设为401(未登录)
        if (token == null || token.isEmpty()) {
            log.info("请求头中没有token，用户未登录");
            // 响应状态码设为401(未登录)
            response.setStatus(401);
            return;
        }

        // 5. 存在，解析JWT令牌，解析失败，记录日志，响应状态码设为401(未登录)
        try {
            Claims claims = JwtUtils.parseJWT(token);
        } catch (Exception e){
            log.info("解析JWT令牌失败，令牌非法");
            // 响应状态码设为401(未登录)
            response.setStatus(401);
            return;
        }

        // 6. 放行
        filterChain.doFilter(request, response);
    }
}
